home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Libraries / mui / vslider.c < prev   
Encoding:
C/C++ Source or Header  |  1999-05-18  |  14.1 KB  |  491 lines  |  [TEXT/CWIE]

  1. /*
  2.  * Copyright (c) 1990,1997, Silicon Graphics, Inc.
  3.  * ALL RIGHTS RESERVED 
  4.  * Permission to use, copy, modify, and distribute this software for 
  5.  * any purpose and without fee is hereby granted, provided that the above
  6.  * copyright notice appear in all copies and that both the copyright notice
  7.  * and this permission notice appear in supporting documentation, and that 
  8.  * the name of Silicon Graphics, Inc. not be used in advertising
  9.  * or publicity pertaining to distribution of the software without specific,
  10.  * written prior permission. 
  11.  *
  12.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  13.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  14.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  15.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  16.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  17.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  18.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  19.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  20.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  21.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  22.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  23.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  24.  * 
  25.  * US Government Users Restricted Rights 
  26.  * Use, duplication, or disclosure by the Government is subject to
  27.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  28.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  29.  * clause at DFARS 252.227-7013 and/or in similar or successor
  30.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  31.  * Unpublished-- rights reserved under the copyright laws of the
  32.  * United States.  Contractor/manufacturer is Silicon Graphics,
  33.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  34.  *
  35.  * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
  36.  */
  37.  
  38. #include "glut.h"
  39. #include <stdlib.h>
  40. #include "gizmo.h"
  41. #include "vslider.h"
  42. #include "displaylist.h"
  43. #include "uicolor.h"
  44.  
  45. extern    VSlider *locatedvs;
  46.  
  47. int getvstrough(muiObject *obj)
  48. {
  49.     return obj->ymax - obj->ymin - 2*ARROWHEIGHT;
  50. }
  51.  
  52. void    setvscenter(muiObject *obj, int scenter)
  53. {
  54.     VSlider *vs = (VSlider *)obj->object;
  55.     if ((scenter - vs->shalf) < (obj->ymin+ARROWHEIGHT))
  56.         vs->scenter = getvstrough(obj)/2 + obj->ymin+ARROWHEIGHT;
  57.     else
  58.         vs->scenter = scenter;
  59. }
  60.  
  61. void    muiSetVSArrowDelta(muiObject *obj, int newd)
  62. {
  63.     VSlider *vs = (VSlider *)obj->object;
  64.     vs->arrowdelta = newd;
  65. }
  66.  
  67. VSlider    *newvs(muiObject *obj, int ymin, int ymax, int scenter, int shalf)
  68. {
  69.     VSlider    *vs;
  70.  
  71.     vs = (VSlider *)malloc(sizeof(VSlider));
  72.     obj->object = (VSlider *)vs;
  73.     if (shalf == 0) {
  74.     vs->shalf = 0;
  75.     } else if (shalf < MINSHALF) 
  76.     vs->shalf = MINSHALF;
  77.     else
  78.     vs->shalf = shalf;
  79.  
  80.     if ((ymax - ymin + 1) <= (2*ARROWHEIGHT+2*MINSHALF))
  81.         vs->thumb = 0;
  82.     else
  83.         vs->thumb = 1;
  84.  
  85.     setvscenter(obj, scenter);
  86.     vs->oldpos = vs->scenter;
  87.  
  88.     muiSetVSArrowDelta(obj, 1);
  89.     return vs;
  90. }
  91.  
  92. void    freevs(VSlider *vs)
  93. {
  94.     if (vs) {
  95.     free(vs);
  96.     }
  97. }
  98.  
  99. void    drawvsarrows(muiObject *obj)
  100. {
  101.     int    xmin = obj->xmin, xmax = obj->xmin+ARROWHEIGHT,
  102.         ymin = obj->ymin, ymax = obj->ymax;
  103.  
  104.     if (!muiGetVisible(obj))
  105.         return;
  106.  
  107.     /* Draw the arrows: */
  108.  
  109.     /* down arrow */
  110.     uiDkGray();
  111.     uirecti(xmin,ymin,xmax,ymin+20);
  112.  
  113.     if (muiGetVisible(obj)) {
  114.         if (obj->locate == SCROLLDOWN) {
  115.             if (obj->select == SCROLLDOWN) {
  116.                 drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiMmGray,uiWhite);
  117.                 drawedges(xmin+2,xmax-2,ymin+2,ymin+18,uiLtGray,uiWhite);
  118.         } else {
  119.                 drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiWhite,uiMmGray);
  120.                 drawedges(xmin+2,xmax-2,ymin+2,ymin+18,uiWhite,uiLtGray);
  121.         }
  122.         uiVyLtGray();
  123.         uirectfi(xmin+3,ymin+3,xmax-3,ymin+17);
  124.         } else {
  125.             if (obj->select == SCROLLDOWN) {
  126.                 drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiMmGray,uiVyLtGray);
  127.                 drawedges(xmin+2,xmax-2,ymin+2,ymin+18,uiMmGray,uiVyLtGray);
  128.         } else {
  129.                 drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiWhite,uiMmGray);
  130.                 drawedges(xmin+2,xmax-2,ymin+2,ymin+18,uiVyLtGray,uiMmGray);
  131.         }
  132.         uiLtGray();
  133.         uirectfi(xmin+3,ymin+3,xmax-3,ymin+17);
  134.         }
  135.     } else {
  136.         drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiVyLtGray,uiMmGray);
  137.     uiLtGray();
  138.     uirectfi(xmin+2,ymin+2,xmax-2,ymin+18);
  139.     }
  140.  
  141.     /* arrow */
  142.     if (muiGetEnable(obj))
  143.     uiDkGray();
  144.     else
  145.     uiMmGray();
  146.     uimove2i(xmin+5,ymin+14);
  147.     uidraw2i(xmin+14,ymin+14);
  148.     uiendline();
  149.     uirectfi(xmin+6,ymin+13,xmin+13,ymin+12);
  150.     uirectfi(xmin+7,ymin+11,xmin+12,ymin+10);
  151.     uirectfi(xmin+8,ymin+8,xmin+11,ymin+9);
  152.     uirectfi(xmin+9,ymin+6,xmin+10,ymin+7);
  153.    
  154.     /* up arrow */
  155.     uiDkGray();
  156.     uirecti(xmin,ymax-20,xmax,ymax);
  157.  
  158.     if (muiGetEnable(obj)) {
  159.         if (obj->locate == SCROLLUP) {
  160.             if (obj->select == SCROLLUP) {
  161.                 drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiMmGray,uiWhite);
  162.                 drawedges(xmin+2,xmax-2,ymax-18,ymax-2,uiLtGray,uiWhite);
  163.         } else {
  164.                 drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiWhite,uiMmGray);
  165.                 drawedges(xmin+2,xmax-2,ymax-18,ymax-2,uiWhite,uiLtGray);
  166.         }
  167.         uiVyLtGray();
  168.         uirectfi(xmin+3,ymax-17,xmax-3,ymax-3);
  169.         } else {
  170.             if (obj->select == SCROLLUP) {
  171.                 drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiMmGray,uiVyLtGray);
  172.                 drawedges(xmin+2,xmax-2,ymax-18,ymax-2,uiMmGray,uiVyLtGray);
  173.         } else {
  174.                 drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiWhite,uiMmGray);
  175.                 drawedges(xmin+2,xmax-2,ymax-18,ymax-2,uiVyLtGray,uiMmGray);
  176.         }
  177.         uiLtGray();
  178.         uirectfi(xmin+3,ymax-17,xmax-3,ymax-3);
  179.         }
  180.     } else {
  181.     drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiVyLtGray,uiMmGray);
  182.     uiLtGray();
  183.     uirectfi(xmin+2,ymax-18,xmax-2,ymax-2);
  184.     }
  185.  
  186.     /* arrow */
  187.  
  188.     if (muiGetEnable(obj))
  189.         uiDkGray();
  190.     else
  191.         uiMmGray();
  192.     uirectfi(xmin+9,ymax-6,xmin+10,ymax-7);
  193.     uirectfi(xmin+8,ymax-8,xmin+11,ymax-9);
  194.     uirectfi(xmin+7,ymax-10,xmin+12,ymax-11);
  195.     uirectfi(xmin+6,ymax-12,xmin+13,ymax-13);
  196.     uimove2i(xmin+5,ymax-14);
  197.     uidraw2i(xmin+14,ymax-14);
  198.     uiendline();
  199. }
  200.  
  201. void    drawvs(muiObject *obj)
  202. {
  203.     VSlider *vs = (VSlider *)obj->object;
  204.  
  205.     int    xmin = obj->xmin, ymax = obj->ymax-ARROWHEIGHT, 
  206.         ymin = obj->ymin+ARROWHEIGHT;
  207.     int     xmax = xmin+SLIDERWIDTH;
  208.     int    symin = vs->scenter - vs->shalf;
  209.     int    symax = vs->scenter + vs->shalf;
  210.     int    oldsymin = vs->oldpos - vs->shalf;
  211.     int    oldsymax = vs->oldpos + vs->shalf;
  212.  
  213.     drawsetup();
  214.  
  215.     if (!muiGetVisible(obj)) {
  216.     backgrounddraw(xmin,ymin,xmax,ymax);
  217.         drawrestore();
  218.         return;
  219.     }
  220.  
  221.     /* trough */
  222.  
  223.     uiDkGray();
  224.     uirecti(xmin, ymin, xmax, ymax);
  225.  
  226.     drawedges(xmin+1,xmax-1,ymin+1,ymax-1,uiVyLtGray,uiMmGray);
  227.  
  228.     uiLtGray();
  229.         uirectfi(xmin+2, ymin+2, xmax-2, ymax-2);
  230.  
  231.     if (vs->thumb) {
  232.         /* last thumb position */
  233.         if ((vs->oldpos != vs->scenter) && (obj->enable)) {
  234.     
  235.             uiDkGray();
  236.             uimove2i(xmax-2, oldsymax);
  237.             uidraw2i(xmin+1, oldsymax);
  238.         uiendline();
  239.     
  240.             uiMmGray();
  241.             uimove2i(xmin+1, oldsymax);
  242.             uidraw2i(xmin+1, oldsymin);
  243.         uiendline();
  244.         
  245.             uiVyLtGray();
  246.             uimove2i(xmin+2, oldsymin);
  247.             uidraw2i(xmax-1, oldsymin);
  248.         uiendline();
  249.     
  250.             uiLtGray();
  251.             uimove2i(xmax-1, oldsymin);
  252.             uidraw2i(xmax-1, oldsymax);
  253.         uiendline();
  254.  
  255.             uiVyLtGray();
  256.             uimove2i(xmax-2, --oldsymax);
  257.             uidraw2i(xmax-2, ++oldsymin);
  258.             uidraw2i(xmin+2, oldsymin);
  259.         uiendline();
  260.     
  261.             uiVyDkGray();
  262.             uimove2i(xmin+2, oldsymin);
  263.             uidraw2i(xmin+2, oldsymax);
  264.             uidraw2i(xmax-3, oldsymax);
  265.         uiendline();
  266.     
  267.             uiDkGray();
  268.             uimove2i(xmin+3, --oldsymax);
  269.             uidraw2i(xmax-3, oldsymax);
  270.         uiendline();
  271.         
  272.             uiLtGray();
  273.             uimove2i(xmax-3, oldsymax);
  274.             uidraw2i(xmax-3, ++oldsymin);
  275.             uidraw2i(xmin+3, oldsymin);
  276.         uiendline();
  277.     
  278.             uiMmGray();
  279.             uirectfi(xmin+3, ++oldsymin, xmax-4, --oldsymax);
  280.         
  281.         }
  282.  
  283.         if (obj->enable) {
  284.  
  285.             /* thumb */
  286.             uiDkGray();
  287.                 uirecti(xmin,symin,xmax,symax);
  288.     
  289.             if (obj->locate == THUMB) {
  290.             drawedges(xmin+1,xmax-1,symin+1,symax-1,uiWhite,uiDkGray);
  291.             drawedges(xmin+2,xmax-2,symin+2,symax-2,uiWhite,uiLtGray);
  292.             drawedges(xmin+3,xmax-3,symin+3,symax-3,uiWhite,uiLtGray);
  293.     
  294.             uiVyLtGray();
  295.                 uirectfi(xmin+4, symin+4, xmax-4, symax-4);
  296.         
  297.             /* ridges on thumb */
  298.             uiDkGray();
  299.                 uimove2i(xmin+3,vs->scenter);
  300.                 uidraw2i(xmax-3,vs->scenter);
  301.             uiendline();
  302.                 uimove2i(xmin+3,vs->scenter-4);
  303.                 uidraw2i(xmax-3,vs->scenter-4);
  304.             uiendline();
  305.                 uimove2i(xmin+3,vs->scenter+4);
  306.                 uidraw2i(xmax-3,vs->scenter+4);
  307.             uiendline();
  308.    
  309.             uiWhite();
  310.             uirectfi(xmin+3,vs->scenter+1,xmax-3,vs->scenter+2);
  311.             uirectfi(xmin+3,vs->scenter+5,xmax-3,vs->scenter+6);
  312.             uirectfi(xmin+3,vs->scenter-2,xmax-3,vs->scenter-3);
  313.             } else {
  314.             drawedges(xmin+1,xmax-1,symin+1,symax-1,uiWhite,uiDkGray);
  315.             drawedges(xmin+2,xmax-2,symin+2,symax-2,uiVyLtGray,uiMmGray);
  316.             drawedges(xmin+3,xmax-3,symin+3,symax-3,uiVyLtGray,uiMmGray);
  317.    
  318.               uiLtGray();
  319.                   uirectfi(xmin+4, symin+4, xmax-4, symax-4);
  320.             
  321.             /* ridges on thumb */
  322.             uiBlack();
  323.                 uimove2i(xmin+3,vs->scenter);
  324.                 uidraw2i(xmax-3,vs->scenter);
  325.             uiendline();
  326.                 uimove2i(xmin+3,vs->scenter-4);
  327.                 uidraw2i(xmax-3,vs->scenter-4);
  328.             uiendline();
  329.                 uimove2i(xmin+3,vs->scenter+4);
  330.                 uidraw2i(xmax-3,vs->scenter+4);
  331.             uiendline();
  332.  
  333.             uiWhite();
  334.                 uimove2i(xmin+3,vs->scenter+1);
  335.                 uidraw2i(xmax-3,vs->scenter+1);
  336.             uiendline();
  337.                 uimove2i(xmin+3,vs->scenter-3);
  338.                 uidraw2i(xmax-3,vs->scenter-3);
  339.             uiendline();
  340.                 uimove2i(xmin+3,vs->scenter+5);
  341.                 uidraw2i(xmax-3,vs->scenter+5);
  342.             uiendline();
  343.             }
  344.         }
  345.     }
  346.     drawvsarrows(obj);
  347.  
  348.     drawrestore();
  349. }
  350.  
  351. enum muiReturnValue vshandler(muiObject *obj, int event, int value, int x, int y)
  352. {
  353.     int my = y;
  354.     static int mfudge=0;
  355.     static enum muiReturnValue retval = MUI_NO_ACTION;
  356.     VSlider *vs = (VSlider *)obj->object;
  357.  
  358.     if (!muiGetEnable(obj) || !muiGetVisible(obj))
  359.     return MUI_NO_ACTION;
  360.     switch (event) {
  361.     case MUI_DEVICE_RELEASE:
  362.         if (value == 0) { 
  363.         vs->oldpos = vs->scenter; 
  364.         muiSetSelect(obj, 0);
  365.         return MUI_SLIDER_RETURN; 
  366.         }
  367.     case MUI_DEVICE_PRESS:
  368.     case MUI_DEVICE_CLICK:
  369.         /* in the arrows */
  370.         if (my >= obj->ymin && my <= obj->ymax && 
  371.            (my < obj->ymin+ARROWHEIGHT || my > obj->ymax-ARROWHEIGHT)) {
  372.         mfudge = -10000;
  373.         if (my < obj->ymin+ARROWHEIGHT) { /* boink down */
  374.             my = vs->scenter - vs->arrowdelta;
  375.             retval = MUI_SLIDER_SCROLLDOWN;
  376.         } else { /* boink up */
  377.             my = vs->scenter + vs->arrowdelta;
  378.             retval = MUI_SLIDER_SCROLLUP;
  379.         }
  380.         if (event == MUI_DEVICE_CLICK) {
  381.             muiSetSelect(obj, 0);
  382.             retval = MUI_SLIDER_RETURN;
  383.         }
  384.         if (my - vs->shalf < obj->ymin+1+ARROWHEIGHT)
  385.             my = obj->ymin+1+vs->shalf+ARROWHEIGHT;
  386.         if (my + vs->shalf > obj->ymax-1-ARROWHEIGHT) 
  387.             my = obj->ymax-1-vs->shalf-ARROWHEIGHT;
  388.         vs->scenter = my; 
  389.         break;
  390.         } else if (my >= obj->ymin && my <= obj->ymax)
  391.             retval = MUI_SLIDER_THUMB;
  392.         vs->oldpos = vs->scenter;
  393.         if (my >= vs->scenter-vs->shalf && my <= vs->scenter+vs->shalf)
  394.         mfudge = vs->scenter - my;
  395.         else
  396.         mfudge = 0;
  397.         break;
  398.     case MUI_DEVICE_DOWN:
  399.         if (mfudge == -10000) {    /* auto - repeat the arrow keys */
  400.                 if (retval == MUI_SLIDER_SCROLLDOWN) {
  401.                     my = vs->scenter - vs->arrowdelta;
  402.                     if (my - vs->shalf < obj->ymin+1+ARROWHEIGHT)
  403.                         my = obj->ymin+1+vs->shalf+ARROWHEIGHT;
  404.                 } else {
  405.                     my = vs->scenter + vs->arrowdelta;
  406.                     if (my + vs->shalf > obj->ymax-1-ARROWHEIGHT)
  407.                         my = obj->ymax-1-vs->shalf-ARROWHEIGHT;
  408.                 }
  409.                 vs->scenter = my;
  410.                 break;
  411.         }
  412.         my = y+mfudge;
  413.         if (my - vs->shalf < obj->ymin+1+ARROWHEIGHT)
  414.         my = obj->ymin+1+vs->shalf+ARROWHEIGHT;
  415.         if (my + vs->shalf > obj->ymax-1-ARROWHEIGHT) 
  416.         my = obj->ymax-1-vs->shalf-ARROWHEIGHT;
  417.  
  418.         /* adjust thumb */
  419.         vs->scenter = my; 
  420.         break;
  421.     }
  422.     x = x;    /* for lint's sake */
  423.     return retval;
  424. }
  425.  
  426. float muiGetVSVal(muiObject *obj)
  427. {
  428.     VSlider *vs = (VSlider *)obj->object;
  429.  
  430.     return (vs->scenter-obj->ymin-1.0-vs->shalf-ARROWHEIGHT)/
  431.         (obj->ymax - obj->ymin - 2.0*vs->shalf - 2.0-2*ARROWHEIGHT);
  432. }
  433.  
  434. void    setvshalf(muiObject *obj, int shalf)
  435. {
  436.     VSlider *vs = (VSlider *)obj->object;
  437.     vs->shalf = shalf;
  438.     if (vs->shalf==0)
  439.     muiSetEnable(obj, 0);
  440.     else if (vs->shalf < MINSHALF) {
  441.         vs->shalf = MINSHALF;
  442.     muiSetEnable(obj, 1);
  443.     } else if (2*vs->shalf >= getvstrough(obj)) {
  444.         vs->shalf = getvstrough(obj)/2;
  445.     muiSetEnable(obj, 0);
  446.     }
  447. }
  448.  
  449. void    movevsval(muiObject *obj, float val)
  450. {
  451.     float    f;
  452.     VSlider *vs = (VSlider *)obj->object;
  453.  
  454.     if (val < 0.0) val = 0.0;
  455.     if (val > 1.0) val = 1.0;
  456.     f = val*(obj->ymax - obj->ymin - 2.0*vs->shalf - 2.0-2*ARROWHEIGHT);
  457.     vs->scenter = f + vs->shalf + obj->ymin + 1.0+ARROWHEIGHT;
  458.  
  459.     if ((vs->scenter + vs->shalf) > (obj->ymax - ARROWHEIGHT))
  460.         vs->scenter = obj->ymax - ARROWHEIGHT - vs->shalf;
  461.     if ((vs->scenter - vs->shalf) < (obj->ymin+ ARROWHEIGHT))
  462.         vs->scenter = obj->ymin + ARROWHEIGHT + vs->shalf;
  463. }
  464.  
  465. void    muiSetVSValue(muiObject *obj, float val)
  466. {
  467.     VSlider *vs = (VSlider *)obj->object;
  468.     movevsval(obj, (float) val);
  469.     vs->oldpos = vs->scenter;
  470. }
  471.  
  472. /* 
  473.  * visible is windowheight/dataheight
  474.  * top is top/dataheight
  475.  */
  476.  
  477. void
  478. adjustvsthumb(muiObject *obj, double visible, double top)
  479. {
  480.     int size;
  481.     
  482.     if (visible >= 1.0) {
  483.         size = getvstrough(obj) + 1;
  484.     } else {
  485.         size = visible*getvstrough(obj);
  486.     }
  487.     muiSetEnable(obj, 1);
  488.     setvshalf(obj, size/2);
  489.     muiSetVSValue(obj, (float) (1.0 - top));
  490. }
  491.